﻿using System;
using System.Collections.Generic;

// 学生类
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string StudentId { get; set; }
    public double Score { get; set; }

    // 构造函数
    public Student(string name, int age, string studentId, double score)
    {
        Name = name;
        Age = age;
        StudentId = studentId;
        Score = score;
    }

    // 重写ToString方法，方便输出学生信息
    public override string ToString()
    {
        return $"学号: {StudentId}, 姓名: {Name}, 年龄: {Age}, 成绩: {Score}";
    }
}

// 班级类，实现索引器访问
public class Class
{
    private List<Student> students;

    // 班级属性
    public string ClassName { get; set; }
    public string ClassId { get; set; }

    // 构造函数
    public Class(string className, string classId)
    {
        ClassName = className;
        ClassId = classId;
        students = new List<Student>();
    }

    // 索引器 - 通过索引访问学生
    public Student this[int index]
    {
        get
        {
            if (index < 0 || index >= students.Count)
            {
                throw new IndexOutOfRangeException($"索引 {index} 超出范围，班级中共有 {students.Count} 名学生");
            }
            return students[index];
        }
        set
        {
            if (index < 0 || index >= students.Count)
            {
                throw new IndexOutOfRangeException($"索引 {index} 超出范围，班级中共有 {students.Count} 名学生");
            }
            students[index] = value;
        }
    }

    // 索引器 - 通过学号访问学生
    public Student this[string studentId]
    {
        get
        {
            foreach (var student in students)
            {
                if (student.StudentId == studentId)
                {
                    return student;
                }
            }
            throw new KeyNotFoundException($"未找到学号为 {studentId} 的学生");
        }
    }

    // 添加学生
    public void AddStudent(Student student)
    {
        students.Add(student);
        Console.WriteLine($"学生 {student.Name} 已添加到班级 {ClassName}");
    }

    // 移除学生
    public bool RemoveStudent(string studentId)
    {
        for (int i = 0; i < students.Count; i++)
        {
            if (students[i].StudentId == studentId)
            {
                var removedStudent = students[i];
                students.RemoveAt(i);
                Console.WriteLine($"学生 {removedStudent.Name} 已从班级 {ClassName} 中移除");
                return true;
            }
        }
        Console.WriteLine($"未找到学号为 {studentId} 的学生");
        return false;
    }

    // 获取学生数量
    public int StudentCount
    {
        get { return students.Count; }
    }

    // 显示所有学生信息
    public void DisplayAllStudents()
    {
        Console.WriteLine($"\n=== 班级 {ClassName} 学生列表 ===");
        if (students.Count == 0)
        {
            Console.WriteLine("班级中没有学生");
            return;
        }

        for (int i = 0; i < students.Count; i++)
        {
            Console.WriteLine($"[{i}] {students[i]}");
        }
    }

    // 按成绩排序
    public void SortByScore(bool descending = false)
    {
        if (descending)
        {
            students.Sort((s1, s2) => s2.Score.CompareTo(s1.Score));
        }
        else
        {
            students.Sort((s1, s2) => s1.Score.CompareTo(s2.Score));
        }
        Console.WriteLine($"已按成绩{(descending ? "降序" : "升序")}排序");
    }
}

// 测试程序
class Program
{
    static void Main(string[] args)
    {
        // 创建班级
        Class myClass = new Class("计算机科学与技术1班", "CS2024");

        // 添加学生
        myClass.AddStudent(new Student("张三", 20, "2024001", 85.5));
        myClass.AddStudent(new Student("李四", 19, "2024002", 92.0));
        myClass.AddStudent(new Student("王五", 21, "2024003", 78.5));
        myClass.AddStudent(new Student("赵六", 20, "2024004", 88.0));

        Console.WriteLine($"\n班级中学生总数: {myClass.StudentCount}");

        // 显示所有学生
        myClass.DisplayAllStudents();

        // 使用索引器访问学生 - 通过索引
        Console.WriteLine("\n=== 通过索引访问学生 ===");
        try
        {
            Console.WriteLine($"第一个学生: {myClass[0]}");
            Console.WriteLine($"第二个学生: {myClass[1]}");

            // 修改学生信息
            myClass[2] = new Student("王五", 21, "2024003", 95.0);
            Console.WriteLine($"修改后的第三个学生: {myClass[2]}");
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine($"错误: {ex.Message}");
        }

        // 使用索引器访问学生 - 通过学号
        Console.WriteLine("\n=== 通过学号访问学生 ===");
        try
        {
            Console.WriteLine($"学号2024002的学生: {myClass["2024002"]}");
            Console.WriteLine($"学号2024004的学生: {myClass["2024004"]}");
        }
        catch (KeyNotFoundException ex)
        {
            Console.WriteLine($"错误: {ex.Message}");
        }

        // 测试排序功能
        Console.WriteLine("\n=== 按成绩升序排序 ===");
        myClass.SortByScore();
        myClass.DisplayAllStudents();

        // 测试移除学生
        Console.WriteLine("\n=== 移除学生测试 ===");
        myClass.RemoveStudent("2024002");
        myClass.DisplayAllStudents();

        // 测试异常情况
        Console.WriteLine("\n=== 异常测试 ===");
        try
        {
            Console.WriteLine(myClass[10]); // 超出范围的索引
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine($"索引异常: {ex.Message}");
        }

        try
        {
            Console.WriteLine(myClass["999999"]); // 不存在的学号
        }
        catch (KeyNotFoundException ex)
        {
            Console.WriteLine($"查找异常: {ex.Message}");
        }
    }
}